/**
 * 
 */
package compilador.analizadorSintactico.categoriasSintacticas;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import compilador.analizadorLexico.simbolos.SimboloLexico;
import compilador.analizadores.AnalizadorSemantico;

/**
 * @author Nolberto Castellanos Rodriguez
 * @author Yurani Alejandra Salamanca Lotero
 *
 * Clase que representa un termino
 */
public class Termino {
	
//	-------------------------------------------------------------------------------------------------
//	ATRIBUTOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Atributo que contiene los factores del termino
	 */
	private ArrayList<Factor> factores;
	
	/**
	 * Atributo que contiene los simbolos del termino
	 */
	private ArrayList<SimboloLexico> simbolos;
	
//	-------------------------------------------------------------------------------------------------
//	CONSTRUCTORES
//	-------------------------------------------------------------------------------------------------

	/**
	 * Constructor que permite crear un nuevo termino
	 * @param factores. Factores que componen un termino
	 */
	public Termino(ArrayList<Factor> factores, ArrayList<SimboloLexico> simbolos) {
		super();
		this.factores = factores;
		this.simbolos = simbolos;
	}
	
//	-------------------------------------------------------------------------------------------------
//	METODOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Metodo que permite agregar hojas al nodo de la clase
	 * @return el nodo de la clase con sus hojas
	 */
	public DefaultMutableTreeNode getArbolVisual(){
		DefaultMutableTreeNode miRaiz =  new  DefaultMutableTreeNode("Termino");
		
		for (Factor factor : factores) 
			miRaiz.add(factor.getArbolVisual());
		
		for (SimboloLexico simbolo : simbolos) 
			miRaiz.add(new DefaultMutableTreeNode(simbolo.getLexema()));
		
		return miRaiz;
	}

	/**
	 * Metodo que permite determinar el tipo de un termino
	 * @return
	 */
	public String determinarTipo() {
		String tipo = factores.get(0).getFactor().getLexema();
		
		if(factores.size() > 1){
			for (int i = 1; i < factores.size(); i++) {
				tipo =AnalizadorSemantico.calcularTipo(tipo, factores.get(i).getFactor().getLexema());
			}
		}
		
		return tipo;
	}

	/**
	 * @return
	 */
	public String getJavaCode() {
		
		String retornable = "(";
		
		if(factores != null){
			retornable += factores.get(0).getFactor().getLexema();
		
			for (int i = 1; i < factores.size(); i++) {
				if(simbolos != null && simbolos.size() > i-1)
					retornable += simbolos.get(i-1).getLexema();
				
				retornable += factores.get(i).getFactor().getLexema();
			}
		}
		
		return retornable + ")";
	}
	
//	-------------------------------------------------------------------------------------------------
//	GETTERS & SETTERS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Metodo que nos retorna el valor de factores
	 * @return  factores. Valor retornado
	 */
	public ArrayList<Factor> getFactores() {
		return factores;
	}

	/**
	 * Metodo que permite asignar el valor de factores
	 * @param factores. Valor a asignar factores
	 */
	public void setFactores(ArrayList<Factor> factores) {
		this.factores = factores;
	}

	/**
	 * Metodo que nos retorna el valor de simbolos
	 * @return  simbolos. Valor retornado
	 */
	public ArrayList<SimboloLexico> getSimbolos() {
		return simbolos;
	}

	/**
	 * Metodo que permite asignar el valor de simbolos
	 * @param simbolos. Valor a asignar simbolos
	 */
	public void setSimbolos(ArrayList<SimboloLexico> simbolos) {
		this.simbolos = simbolos;
	}


}